import { NodePath } from '@babel/traverse'
/**
 * babel-traverse  可以实现对 AST数的 替换， 添加，删除节点
 *
 * @babel/traverse 目前7.23.9 本身没有带d.ts 类型声明，需要安装 声明问题包
 * pnpm add @types/babel__traverse -D
 */

import { parse } from '@babel/parser'
import traverse from '@babel/traverse'
import generate from '@babel/generator'
import fs from 'node:fs'
import path from 'node:path'

const target = path.resolve(__dirname, '../demo/03.js')

const content = fs.readFileSync(target, {
	encoding: 'utf8',
})

const ast = parse(content, {
	sourceType: 'module',
})

traverse(ast, {
	// 这里会执行多次, 所以，下面每次拿到的节点type 和 name 都会不一样，我们要判断，当遍历到适合我们需要的步骤，拦截一下
	enter(path: NodePath) {
		const node = path.node
		// console.log('节点信息');
		// console.log(node);
		if (node.type === 'Identifier' && node.name === 'n') {
			// 将原始AST中的 n 改为 x, 这里 trverse 修改的直接是 AST对象的引用， 所以，下面的 genrage 是可以直接将 ast 对象生成， 查看效果
			node.name = 'x'
		}
	},
})

/**
原始代码，已经将 n 替换为 x
 function square(x) {
  return x * x;
}
 */
let gRes = generate(ast)

console.log(gRes.code)
